home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / devel / vbcc-ppc / machines / amigappc / include / stdarg.h < prev    next >
C/C++ Source or Header  |  1999-01-01  |  1KB  |  53 lines

  1. /* stdarg.h - PowerPC */
  2.  
  3. #ifndef __STDARG_H
  4. #define __STDARG_H 1
  5.  
  6. typedef struct {
  7.   int gpr;
  8.   int fpr;
  9.   char *regbase;
  10.   char *membase;
  11. } va_list;
  12.  
  13. char *__va_start(void);
  14. char *__va_regbase(void);
  15. int __va_fixedgpr(void);
  16. int __va_fixedfpr(void);
  17.  
  18. #define va_start(vl,dummy) \
  19.   ( \
  20.     vl.gpr=__va_fixedgpr(), \
  21.     vl.fpr=__va_fixedfpr(), \
  22.     vl.regbase=__va_regbase(), \
  23.     vl.membase=__va_start() \
  24.   )
  25.  
  26. #define va_end(vl) (vl.regbase=vl.membase=0)
  27.  
  28. #define __va_size(type) ((sizeof(type)+3)/4*4)
  29.  
  30. #define va_arg(vl,type) \
  31.  ( \
  32.   (__typeof(type)&15)>8? \
  33.     (vl.membase+=__va_size(type),((type*)vl.membase)[-1]) \
  34.   : \
  35.    ( \
  36.     (((__typeof(type)&15)==5||(__typeof(type)&15)==6)) ? \
  37.      ( \
  38.       ++vl.fpr<=8 ? \
  39.         ((type*)(vl.regbase+32))[vl.fpr-1] \
  40.       : \
  41.         (vl.membase+=__va_size(type),((type*)vl.membase)[-1]) \
  42.      ) \
  43.     : \
  44.      ( \
  45.       ++vl.gpr<=8 ? \
  46.         ((type*)(vl.regbase+0))[vl.gpr-1] \
  47.       : \
  48.         (vl.membase+=__va_size(type),((type*)vl.membase)[-1]) \
  49.      ) \
  50.    ) \
  51.  )
  52. #endif
  53.